package imnu.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @author: lys
 * @类名: Test01
 * @Title:
 * @date: 2020/7/23
 **/
public class Test01 {
    public static void main(String[] args) {
        test01();
        System.out.println("******************************");
        test02();
        System.out.println("******************************");
        test03();
        System.out.println("******************************");
    }

    public static void test03() {
        //方式二
        Student stu = new Student();
        //获取类文件
        Class type2 = stu.getClass();
        try {
            //获取指定某个属性
            Field stuName = type2.getDeclaredField("stuName");
            //设置操作权限，让他可以对私有的属性进行操作
            stuName.setAccessible(true);
            //对属性值进行操作
            stuName.set(stu,"张三");
            System.out.println(stu);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取类文件中的属性信息
    public static void test02() {
        //方式一
        Class type1 = Student.class;
        //获取该类下的所有属性信息，不受访问控制符的限制
        Field[] f = type1.getDeclaredFields();
        for (Field ff:f ) {
            //遍历该类下的所有属性信息
            //getModifiers()获取属性的访问控制修饰符，返回值类型为int类型，需要只用Modifier的toString方法进行转义
            //getType()方法：进行获取属性的数据类型
            //getName()方法：获取属性的名字
            System.out.println(Modifier.toString(ff.getModifiers())+"\t"
                    +ff.getType().getSimpleName()+"\t"+ff.getName());
        }
    }

    //获取类文件的方式
    public static void test01() {
        //方式一
        Class type1 = Student.class;
        //方式二
        Student stu = new Student();
        Class type2 = stu.getClass();
        //方式三
        try {
            //使用三种方式获取的类文件是同一个类文件对象
            Class type3 = Class.forName("imnu.reflect.Student");
            System.out.println("type1==type2 "+(type1==type2));
            System.out.println("type1==type3 "+(type1==type3));
            System.out.println("type2==type3 "+(type2==type3));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
